<?php

namespace app\job;

use app\common\model\OrderTicket;
use app\admin\model\Order as OrderModel;
use app\admin\model\user\Coupons as UserCoupons;
use think\Exception;
use think\Log;
use think\queue\Job;


/**
 * 取消超时订单
 * 用于处理队列中的任务
 */
class CancelorderJob
{

    /**
     * fire是消息队列默认调用的方法
     * @param Job $job 当前的任务对象
     * @param array|mixed $data 发布任务时自定义的数据
     */
    public function fire(Job $job, $data)
    {
        Log::info('取消超时订单job,order_id:'.$data);
        if (empty($data)) {
            Log::error(sprintf('[%s][%s] 队列无消息', __CLASS__, __FUNCTION__));
            return;
        }

        //有效消息到达消费者时可能已经不再需要执行了
        if (!$this->checkJob($data)) {
            $job->delete();
            Log::record("Job does not need to be executed");
            return;
        }
//        Log::record("需要执行2");
        //执行业务处理
        if ($this->doJob($data)) {
//            Log::record("执行了2");
            $job->delete();//任务执行成功后删除
            Log::record("job has been down and deleted");
        } else {
            //检查任务重试次数
            if ($job->attempts() > 3) {
                Log::record("job has been retried more that 3 times");
//                $job->release(10); // 10秒后在执行
                $job->delete(); // 删除任务
            }
        }
    }

    /**
     * 消息在到达消费者时可能已经不需要执行了
     * @param array|mixed $data 发布任务时自定义的数据
     * @return boolean 任务执行的结果
     */
    private function checkJob($data)
    {
        Log::record('验证任务是否需要执行1');
//        $OrderModel = new OrderModel();
//        $order_id = $data;
//        $order = $OrderModel->where(['status'=>0,'id'=>$order_id])->find();
//        Log::record('验证任务是否需要执行2');
//        Log::record($order);
//        if (!$order){
////            Log::record("执行不了");
//            return true;
//        }
//        Log::record('验证任务是否需要执行3');
//        Log::record("需要执行1");
        return true;
    }

    /**
     * 根据消息中的数据进行实际的业务处理
     */
    private function doJob($data)
    {
        // 实际业务流程处理
//        print_r($data['msg'] ?? '实际业务流程处理');
//        Log::record("执行了1:".$data);
        Log::record('实际业务流程处理1');
        try {
            $OrderModel = new OrderModel();
            $order_id = $data;
            //取消主订单
            $order = $OrderModel->where(['status'=>0,'id'=>$order_id])->find();
            $order->status = -1;
            $order->save();
            //票据订单释放座位
            $OrderTicket = new OrderTicket();
            $order_ticket_list = $OrderTicket->where(['status'=>0,'order_id'=>$order_id])->select();
            foreach ($order_ticket_list as $order_ticket){
                $order_ticket->status = -1;
                $order_ticket->save();
            }
            //退回已使用优惠券
//            UserCoupons::where(['use_order_id'=>$order_id])->update(['use_order_id'=>0,'usetime'=>null]);
        } catch (Exception $e) {
            Log::record("doJob异常:".$e->getMessage());
            return false;
        }
        Log::record('实际业务流程处理2');
        return true;
    }

    function task1(){
        print_r("task 1");
    }


    public function failed($data)
    {
        // ...任务达到最大重试次数后，失败了
        Log::error('任务达到最大重试次数后，失败了');
    }


}